/**
 * Created by Administrator on 2017/4/28/028.
 */
let str = ''
let errTips = '网络开小差,请稍后再试'
import util from '@/assets/js/util.js'
const $rpc = async function rpc (url = '', params = {}, sucFn, errFn, alwaysFn) {
  let defaultParams = rpc.defaultParams
  let arg = arguments
  // 第二个参数是对象则传了参数第二个是函数则没有参数
  let hasParams = util.isPlainObject(arg[1])
  if (!url) return false
  let isPost
  // 修复不传参数的情况
  if (hasParams) {
    // 整合参数
    params = Object.assign({}, defaultParams, params)
    // 是否是POST请求
    isPost = params.method && params.method.toLowerCase() === 'post'
  }
  if (util.isFunction(params.beforeSend)) {
    rpc.beforeSend = params.beforeSend
  }
  // 如果发送之前返回false则取消请求
  // 如果没有返回值则也发送请求，其余的为假的则都不执行
  if (!$rpc.beforeSend() && $rpc.beforeSend() != undefined) {
    alert('请求被取消了')
    return false
  }
  for (let i in params) {
    // 把请求方法给过滤掉
    if (i !== 'method') {
      str += i + '=' + params[i] + '&'
    }
  }
  str = str.slice(0, -1)
  // 支持fetch请求的时候处理
  if ('fetch' in window) {
    let myHeaders = new Headers()
    let myInit = {
      method: 'GET',
      headers: myHeaders,
      mode: 'cors',
      cache: 'default',
    }
    if (isPost) {
      myInit.body = str
      myInit.method = 'POST'
    } else {
      url += '?' + str
    }
    let result = await fetch(url, myInit)
    // 请求成功才会进行下一步的业务处理
    if (result.ok) {
      result = await result.json()
      // 如果是函数则执行
      if (result.status === 1) {
        // 业务正常处理
        if (hasParams) {
          if (util.isFunction(arg[2])) {
            arg[2](result.data, result)
          }
        } else {
          if (util.isFunction(arg[1])) {
            arg[1](result.data, result)
          }
        }
      } else {
        // 业务处理失败
        if (hasParams) {
          // 有参数的时候
          if (util.isFunction(arg[3])) {
            // 有参数是函数的时候
            arg[3](result)
          } else {
            // 没有失败处理函数的时候
            util.fadeInOut(result.errormsg && result.errormsg.errmsg)
          }
        } else {
          if (util.isFunction(arg[2])) {
            // 无参数的时候
            arg[2](result.data, result)
          } else {
            // 无参数没有处理函数的时候
            // 没有失败处理函数的时候
            util.fadeInOut(result.errormsg && result.errormsg.errmsg)
          }
        }
      }
      // 无论请求状态是多少都进行执行的
      if (hasParams) {
        if (util.isFunction(arg[4])) {
          arg[4](result.data, result)
        }
      } else {
        if (util.isFunction(arg[3])) {
          arg[3](result.data, result)
        }
      }
    } else {
      alert(errTips)
      rpc.finishSend(result)
    }
  } else {
    let httpReq = new XMLHttpRequest()
    if (isPost) {
      httpReq.open('POST', url, true)
      httpReq.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
      httpReq.send(str)
    } else {
      url += '?t=' + Math.random() + '&' + str
      httpReq.open('GET', url, true)
      httpReq.send()
    }
    httpReq.onreadystatechange = function () {
      if (httpReq.readyState === 4) {
        let result
        if (httpReq.status === 200) {
          result = JSON.parse(httpReq.responseText)
          // 业务是否处理成功
          // 如果是函数则执行
          if (result.status === 1) {
            // 业务正常处理
            if (hasParams) {
              if (util.isFunction(arg[2])) {
                arg[2](result.data, result)
              }
            } else {
              if (util.isFunction(arg[1])) {
                arg[1](result.data, result)
              }
            }
          } else {
            // 业务处理失败
            if (hasParams) {
              // 有参数的时候
              if (util.isFunction(arg[3])) {
                // 有参数是函数的时候
                arg[3](result)
              } else {
                // 没有失败处理函数的时候
                util.fadeInOut(result.errormsg && result.errormsg.errmsg)
              }
            } else {
              if (util.isFunction(arg[2])) {
                // 无参数的时候
                arg[2](result.data, result)
              } else {
                // 无参数没有处理函数的时候
                // 没有失败处理函数的时候
                util.fadeInOut(result.errormsg && result.errormsg.errmsg)
              }
            }
          }
          // 无论请求状态是多少都进行执行的
          if (hasParams) {
            if (util.isFunction(arg[4])) {
              arg[4](result.data, result)
            }
          } else {
            if (util.isFunction(arg[3])) {
              arg[3](result.data, result)
            }
          }
        } else {
          alert(errTips)
          rpc.finishSend(result)
        }
      }
    }
  }
}
$rpc.beforeSend = beforeSend
$rpc.defaultParams = {}
$rpc.finishSend = finishSend
function beforeSend () {
  // 请求业务之前的统一处理
}
function finishSend () {
  // 请求业务完成后的统一处理
  $rpc.beforeSend = beforeSend
  $rpc.finishSend = finishSend
}
export default $rpc
